import { IsString, IsOptional, IsBoolean, IsArray } from 'class-validator';

/**
 * 创建播放列表DTO
 * 用于验证创建播放列表请求的数据
 */
export class CreatePlaylistDto {
  /**
   * 播放列表名称（必填）
   */
  @IsString()
  name: string;

  /**
   * 播放列表描述（可选）
   */
  @IsOptional()
  @IsString()
  description?: string;

  /**
   * 封面图片URL（可选）
   */
  @IsOptional()
  @IsString()
  coverImageUrl?: string;

  /**
   * 是否公开（可选，默认为false）
   */
  @IsOptional()
  @IsBoolean()
  isPublic?: boolean = false;

  /**
   * 是否官方播放列表（可选，默认为false）
   */
  @IsOptional()
  @IsBoolean()
  isOfficial?: boolean = false;

  /**
   * 初始添加的歌曲ID列表（可选）
   */
  @IsOptional()
  @IsArray()
  songIds?: number[] = [];
}

/**
 * 更新播放列表DTO
 * 用于验证更新播放列表请求的数据
 */
export class UpdatePlaylistDto {
  /**
   * 播放列表名称（可选）
   */
  @IsOptional()
  @IsString()
  name?: string;

  /**
   * 播放列表描述（可选）
   */
  @IsOptional()
  @IsString()
  description?: string;

  /**
   * 封面图片URL（可选）
   */
  @IsOptional()
  @IsString()
  coverImageUrl?: string;

  /**
   * 是否公开（可选）
   */
  @IsOptional()
  @IsBoolean()
  isPublic?: boolean;

  /**
   * 是否官方播放列表（可选）
   */
  @IsOptional()
  @IsBoolean()
  isOfficial?: boolean = false;
}

/**
 * 播放列表响应DTO
 * 用于格式化播放列表响应数据
 */
export class PlaylistResponseDto {
  /**
   * 播放列表ID
   */
  id: number;

  /**
   * 播放列表名称
   */
  name: string;

  /**
   * 播放列表描述
   */
  description?: string;

  /**
   * 封面图片URL
   */
  coverImageUrl?: string;

  /**
   * 创建者信息
   */
  createdBy: { id: number; username: string };

  /**
   * 歌曲数量
   */
  songCount: number;

  /**
   * 点赞数
   */
  likes: number;

  /**
   * 是否公开
   */
  isPublic: boolean;

  /**
   * 创建时间
   */
  createdAt: Date;

  /**
   * 更新时间
   */
  updatedAt: Date;

  /**
   * 是否官方播放列表
   */
  isOfficial: boolean;

  /**
   * 推荐等级
   */
  recommendLevel: number;
}

/**
 * 包含歌曲详情的播放列表响应DTO
 * 继承自PlaylistResponseDto，额外包含歌曲列表
 */
export class PlaylistWithSongsDto extends PlaylistResponseDto {
  /**
   * 歌曲列表
   */
  songs: Array<{
    id: number;
    title: string;
    artist: { id: number; name: string };
    album: { id: number; title: string };
    duration: number;
    coverImageUrl?: string;
  }>;
}
